﻿/*
折纸游戏 
Time Limit:1000MS  Memory Limit:32768K


Description:
贝贝太喜欢玩折纸游戏了。整张纸被分成m×m个格子，即构成一个方阵，每个格子里面都写了一个正整数。游戏分两步：首先左右对折，如果面对面相碰的格子中的数字都相同，那么就进行下一步操作，否则停止游戏，并回答游戏的结果是“NO”。而若能进行下一步操作，则就是先展开纸张，恢复原状，然后上下对折，如果面对面相碰的格子中的数字还相同，那么回答游戏的结果就是“YES”；否则就是“NO”了。很显然，如果不巧的话，中间的格子会碰不上其他格子，那就只好随它去了。为了让贝贝不致于失望，每次游戏都要让她有十足的胜算，哦，只有靠编程了，你行。 

Input:
输入数据一上来就有一个整数n(n≤10)，表示后面有n组数据。每组数据一开始，会有一个整数m表示后面有m*m个格子，格子中放有整数数据。 
Output:
每组数据对应一个游戏，应根据格子中的数据值，回答要么“YES”要么“NO”，每个回答都是单独占一行的。 
Sample Input:
2
3
1 2 1
3 5 3
1 2 1
4
2 1 1 2
1 2 3 4
4 3 2 1
2 1 1 2
Sample Output:
YES
NO
*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
	unsigned n;
	scanf("%u", &n);
	while (n--)
	{
		unsigned m;
		scanf("%u", &m);
		
		unsigned size = m * m;
		unsigned * a = new unsigned[size + 1];
		for (unsigned k = 0; k < size; ++k)
		{
			scanf("%u", a + k);
		}
		
		bool symmetrical = true;
		if (symmetrical)
		{
			for (unsigned i = 0; i < m; ++i)
			{
				for (unsigned j = 0, k = m - 1; j != k; ++j, --k)
					if (a[i * m + j] != a[i * m + k])
					{
						symmetrical = false;
						break;
					}
					if (!symmetrical)
						break;
			}
		}
		
		if (symmetrical)
		{
			for (unsigned j = 0; j < m; ++j)
			{
				for (unsigned i = 0, k = m - 1; i != k; ++i, --k)
					if (a[i * m + j] != a[k * m + j])
					{
						symmetrical = false;
						break;
					}
					if (!symmetrical)
						break;
			}
		}
		printf(symmetrical ? "YES\n" : "NO\n");
	}
	return EXIT_SUCCESS;
}
